import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import ipywidgets as widgets
from IPython.display import clear_output, display, HTML
import plotly
import plotly.graph_objects as go
%matplotlib inline
print("NumPy version: ", np.__version__)
print("Matplotlib version: ", matplotlib.__version__)
print("ipywidgets version: ", widgets.__version__)
print("plotly version: ", plotly.__version__)
def izh_neuron(nt, wu, dt, sd, a, b, c, d, v0, vpeak, I):
"""
Izhikevich models
"""
v = np.zeros(wu+nt)
u = np.zeros(wu+nt)
v[0] = v0
u[0] = b*v0
dW = np.sqrt(dt)*np.random.randn(wu+nt)
for t in range(1, wu+nt):
# input current only to a few:
a_xt = 0.04*v[t-1]*v[t-1] + 5.0*v[t-1] + 140.0 - u[t-1] + I
dv = a_xt*dt + sd*dW[t]
du = a*(b*v[t-1] - u[t-1])*dt
# integrate
u[t] = u[t-1] + du
v[t] = v[t-1] + dv
# spiking unit?
if (v[t] > vpeak):
u[t] += d
v[t] = c # vpeak
fig = plt.figure(figsize=(18,4))
plt.plot(dt*np.arange(nt), v[wu:], '-k', lw=2)
plt.ylim(-100,50)
plt.tight_layout()
plt.show()
#return u[wu:], v[wu:]
fig = go.Figure()
# Add traces, one for each slider step
for step in np.arange(0, 5, 0.1):
fig.add_trace(
go.Scatter(
visible=False,
line=dict(color="#00CED1", width=6),
name="nu = " + str(step),
x=np.arange(0, 10, 0.01),
y=np.sin(step * np.arange(0, 10, 0.01))))
# Make 10th trace visible
fig.data[10].visible = True
# Create and add slider
steps = []
for i in range(len(fig.data)):
step = dict(
method="update",
args=[{"visible": [False] * len(fig.data)},
{"title": "Slider switched to step: " + str(i)}], # layout attribute
)
step["args"][0]["visible"][i] = True # Toggle i'th trace to "visible"
steps.append(step)
sliders = [dict(
active=10,
currentvalue={"prefix": "Frequency: "},
pad={"t": 50},
steps=steps
)]
fig.update_layout(
sliders=sliders
)
fig.show()
'''
w_nt = widgets.IntSlider(value=10000, min=1000, max=100000, description='nt:') # number of samples
w_wu = widgets.IntSlider(value=10000, min=1000, max=100000, description='wu:') # number of warm-up samples
w_dt = widgets.FloatSlider(value=0.05, min=0.01, max=0.1, description='dt:') # sampling interval
w_sd = widgets.FloatSlider(value=0.1, min=0, max=10, description='sd:') # noise
w_a = widgets.FloatSlider(value=0.02, min=0, max=1.0, description='a:') # a
w_b = widgets.FloatSlider(value=0.2, min=0, max=1.0, description='b:') # b
w_c = widgets.FloatSlider(value=-50, min=-90, max=0, description='c:') # c
w_d = widgets.FloatSlider(value=2, min=0, max=10, description='d:') # d
w_v0 = widgets.FloatSlider(value=-70, min=-100, max=40, description='v0:') # v0
w_vpeak = widgets.FloatSlider(value=30, min=-10, max=50, description='vpeak:') # vpeak
w_I = widgets.FloatSlider(value=10, min=0, max=30, description='I:') # current
# horizontally aligned sliders (0)
h0 = widgets.HBox([w_nt, w_wu, w_dt])
# horizontally aligned sliders (1)
h1 = widgets.HBox([w_a, w_b, w_c, w_d])
# horizontally aligned sliders (2)
h2 = widgets.HBox([w_v0, w_vpeak])
# horizontally aligned sliders (3)
h3 = widgets.HBox([w_I, w_sd])
# vertical box stacking h0..h3
v = widgets.VBox([h0, h1, h2, h3]) # , background_color='#EEE'
params = {
'nt': w_nt,
'wu': w_wu,
'dt': w_dt,
'sd': w_sd,
'a': w_a,
'b': w_b,
'c': w_c,
'd': w_d,
'v0': w_v0,
'vpeak': w_vpeak,
'I': w_I,
}
out = widgets.interactive_output(izh_neuron, params)
display(v, out)
'''
#'''
w_nt = widgets.IntSlider(value=10000, min=1000, max=100000, description='nt:') # number of samples
w_wu = widgets.IntSlider(value=10000, min=1000, max=100000, description='wu:') # number of warm-up samples
w_dt = widgets.FloatSlider(value=0.05, min=0.01, max=0.1, description='dt:') # sampling interval
w_sd = widgets.FloatSlider(value=0.1, min=0, max=10, description='sd:') # noise
w_a = widgets.FloatSlider(value=0.02, min=0, max=1.0, description='a:') # a
w_b = widgets.FloatSlider(value=0.2, min=0, max=1.0, description='b:') # b
w_c = widgets.FloatSlider(value=-50, min=-90, max=0, description='c:') # c
w_d = widgets.FloatSlider(value=2, min=0, max=10, description='d:') # d
w_v0 = widgets.FloatSlider(value=-70, min=-100, max=40, description='v0:') # v0
w_vpeak = widgets.FloatSlider(value=30, min=-10, max=50, description='vpeak:') # vpeak
w_I = widgets.FloatSlider(value=10, min=0, max=30, description='I:') # current
# horizontally aligned sliders (0)
h0 = widgets.HBox([w_nt, w_wu, w_dt])
# horizontally aligned sliders (1)
h1 = widgets.HBox([w_a, w_b, w_c, w_d])
# horizontally aligned sliders (2)
h2 = widgets.HBox([w_v0, w_vpeak])
# horizontally aligned sliders (3)
h3 = widgets.HBox([w_I, w_sd])
# vertical box stacking h0..h3
#v = widgets.VBox([h0, h1, h2, h3], background_color='#EEE')
params = {
'nt': w_nt,
'wu': w_wu,
'dt': w_dt,
'sd': w_sd,
'a': w_a,
'b': w_b,
'c': w_c,
'd': w_d,
'v0': w_v0,
'vpeak': w_vpeak,
'I': w_I,
}
#widgets.VBox([h0, h1, h2, h3], background_color='#EEE')
#display(v, out)
widgets.interactive(izh_neuron, **params)
#'''
#h0 = widgets.HBox([w_nt, w_wu, w_dt])
#display(h0)
#w = widgets.interactive(izh_neuron, nt=25000, wu=500, dt=0.05, sd=(0.0,10.0),
# a=(0.02,2.0), b=(0.2,2.0), c=(-80,-10), d=(0.0,10.0),
# v0=(-80,-50), vpeak=(10,40), I=(0.0,30.0))
#display(w)
DONE.